package com.imarkket;

import android.app.AlertDialog;
import android.app.DialogFragment;
import android.app.ListActivity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import com.imarkket.Dialogs.c_dialog_Alert;
import com.imarkket.Dialogs.c_dialog_Salir;
import com.imarkket.Dialogs.c_dialog_NewLista;
import com.imarkket.Library.c_logging;
import com.imarkket.Library.c_shopping_list_adapter;
import com.imarkket.sqlite.handler.c_bd_handler;
import com.imarkket.sqlite.model.t_lista;

public class c_shopping_list
        extends ListActivity
        implements
        c_dialog_Salir.ListenerInterface,
        c_dialog_NewLista.ListenerInterface,
        c_dialog_Alert.ListenerInterface {

    static Context context;
    c_bd_handler BD;
    Integer ItemSelected = -1;

    // Para la actividad Settings
    private static final int RESULT_SETTINGS = 1;
    private static final int RESULT_LIST_PRODUCTS = 2;

    // The dialog fragment receives a reference to this Activity through the
    // Fragment.onAttach() callback, which it uses to call the following methods
    // defined by the NoticeDialogFragment.NoticeDialogListener interface

    @Override
    // Alert ok
    public void onSubmitListenerInterface_OK(DialogFragment dialog) {
        // User touched the dialog's positive button
        c_logging.getInstance().log(c_logging.LOG_INFO, getString(R.string.st_la_OK));
    }

    @Override
    public void onSubmitListenerInterface_NewLista(String arg, int Shared) {
        c_logging.getInstance().log(c_logging.LOG_INFO, "Nueva Lista: " + arg);

        int TotalElementosLista = BD.fnc_get_All_T_LISTA().size();
        c_logging.getInstance().log(c_logging.LOG_INFO, "Antes de insertar (lista): " + TotalElementosLista);

        // Creamos el objeto lista
        t_lista lista = new t_lista(arg, Shared, 0, 0);

        // Añadimos el objeto a la lista
        long id = BD.fnc_insert_table_lista(lista);
        c_logging.getInstance().log(c_logging.LOG_INFO, "Insert Result (lista): " + id);

        // Volvemos a calcular el núemro de elementos
        // Al hacer el insert se incrementará en + 1
        TotalElementosLista = BD.fnc_get_All_T_LISTA().size();
        c_logging.getInstance().log(c_logging.LOG_INFO, "Después de insertar (lista): " + TotalElementosLista);

        // Matriz Bidimensional
        // Matriz de n Elementos y 8 columnas, el total de características de cada lista de la compra
        String[][] MatrizBidimensional = new String[TotalElementosLista][8];
        MatrizBidimensional = BD.fnc_export_lista(TotalElementosLista);

        // Recargamos la lista
        // Ponemos más uno para que
        setListAdapter(new c_shopping_list_adapter(this, TotalElementosLista, MatrizBidimensional));

        // Duplicado
        if (id == -2) {
            DialogFragment dialog = new c_dialog_Alert();
            dialog.show(getFragmentManager(), "dialogAlert");
        }

        TotalElementosLista = BD.fnc_get_All_T_LISTA().size();

        // Si el total de Elementos es > 0 ocultamos el icono del centro del layout
        if (TotalElementosLista > 0) {
            ImageView icono_centro = (ImageView) findViewById(R.id.empty);
            icono_centro.setVisibility(View.INVISIBLE);
            // Tener en cuenta esto para incluirlo al borrar un elemento
        } else {
            ImageView icono_centro = (ImageView) findViewById(R.id.empty);
            icono_centro.setVisibility(View.VISIBLE);
            // Tener en cuenta esto para incluirlo al borrar un elemento
        }

        // Listas
        c_logging.getInstance().log(c_logging.LOG_INFO, "Total Registros LISTA: " + TotalElementosLista);

        // Desactivar el teclado nada más entrar para que no aparezca
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

        // TODO: QUE CUANDO VUELVA DE AÑADIR UNA PRODUCTO SE ACTULICE LA T_LISTA
    }

    @Override
    // Salir ok
    public void onSubmitListenerInterface_SiSalir(DialogFragment dialog) {
        // User touched the dialog's positive button
        c_logging.getInstance().log(c_logging.LOG_INFO, getString(R.string.st_la_Yes));

        // Cerramos la Base de datos
        c_logging.getInstance().log(c_logging.LOG_INFO, "Closing DB...");
        BD.fnc_close_database();

        // Salimos
        this.finish();
    }

    @Override
    // Salir cancel
    public void onSubmitListenerInterface_NoSalir(DialogFragment dialog) {
        // User touched the dialog's negative button
        c_logging.getInstance().log(c_logging.LOG_INFO, getString(R.string.st_la_No));
    }

    protected void PRC_Recargar_Lista () {
        // Cargamos el Contexto
        context = getApplicationContext();

        // Base de Datos
        BD = new c_bd_handler(context);

        // Inicializamos la BD
        BD.fnc_bd_handler_init(context);

        int TotalElementosLista = BD.fnc_get_All_T_LISTA().size();

        // Si el total de Elementos es > 0 ocultamos el icono del centro del layout
        if (TotalElementosLista > 0) {
            ImageView icono_centro = (ImageView) findViewById(R.id.empty);
            icono_centro.setVisibility(View.INVISIBLE);
            // Tener en cuenta esto para incluirlo al borrar un elemento
        } else {
            ImageView icono_centro = (ImageView) findViewById(R.id.empty);
            icono_centro.setVisibility(View.VISIBLE);
            // Tener en cuenta esto para incluirlo al borrar un elemento
        }

        // Listas
        c_logging.getInstance().log(c_logging.LOG_INFO, "Total Registros LISTA: " + TotalElementosLista);

        // Matriz Bidimensional
        // Matriz de n Elementos y 8 columnas, el total de características de cada lista de la compra
        String[][] MatrizBidimensional = new String[TotalElementosLista][8];
        MatrizBidimensional = BD.fnc_export_lista(TotalElementosLista);

        // Recargamos la lista
        c_logging.getInstance().log(c_logging.LOG_INFO, "Creando lista");
        setListAdapter(new c_shopping_list_adapter(this, TotalElementosLista, MatrizBidimensional));

        // Desactivar el teclado nada más entrar para que no aparezca
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.l_shopping_list);

        this.PRC_Recargar_Lista ();

    }


    public void onListItemClick(ListView parent, View v, int position, long id) {
        ItemSelected = position;

        // Obtenemos el hash de la lista de productos
        /*
        Del c_shopping_list_adapter:
        String KEY_NCOD_INTERNO = this.MatrizBidimensional[position][0];
        String KEY_ADES_HASH = this.MatrizBidimensional[position][1];
        String KEY_ADES_LARGA = this.MatrizBidimensional[position][2];
        String KEY_NCOD_SHARED = this.MatrizBidimensional[position][3];
        String KEY_NCOD_COUNT = this.MatrizBidimensional[position][4];
        String KEY_NCOD_RATING = this.MatrizBidimensional[position][5];
        String KEY_DFEC_CREACION = this.MatrizBidimensional[position][6];
        String KEY_DFEC_UPDATED = this.MatrizBidimensional[position][7];
         */
        String KEY_ADES_HASH = (String) parent.getAdapter().getItem(ItemSelected);

        // Cerramos la Base de datos
        c_logging.getInstance().log(c_logging.LOG_INFO, "Closing DB...");
        BD.fnc_close_database();

        // Lanzamos la actividad de la lista de elementos de la compra
        Intent activityChangeIntent = new Intent(c_shopping_list.this, c_shopping_list_prod.class);
        activityChangeIntent.putExtra("shopping_list_Item_Selected", ItemSelected);

        // Obtenemos el valor count del item seleccionado del campo "elements" en el xml
        Context context = v.getContext();
        TextView ItemCount = ((TextView) v.findViewById(R.id.elements));
        // obtenemos el valor
        String ItemCountValue = ItemCount.getText().toString();
        c_logging.getInstance().log(c_logging.LOG_INFO, "Productos de la lista seleccionada: " + ItemCountValue);

        // Enviamos el parámetro a la siguiente actividad
        activityChangeIntent.putExtra("shopping_list_Item_Count", ItemCountValue);

        // Enviamos el hash para que la lista de productos se pueda obtener de la BBDD
        activityChangeIntent.putExtra("shopping_list_Item_HASH", KEY_ADES_HASH);

        c_logging.getInstance().log(c_logging.LOG_INFO, "Entrando en lista ItemSelected:" + ItemSelected);
        c_logging.getInstance().log(c_logging.LOG_INFO, "Entrando en lista ItemCountValue:" + ItemCountValue);
        c_logging.getInstance().log(c_logging.LOG_INFO, "Entrando en lista KEY_ADES_HASH:" + KEY_ADES_HASH);
        //c_shopping_list.this.startActivity(activityChangeIntent);
        startActivityForResult(activityChangeIntent, RESULT_LIST_PRODUCTS);

    }

    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        // Save the user's current game state
        // Always call the superclass so it can save the view hierarchy state
        super.onSaveInstanceState(savedInstanceState);
    }

    protected void PRC_Anadir_Lista() {
        c_dialog_NewLista fragment1 = new c_dialog_NewLista();
        fragment1.mListener = c_shopping_list.this;
        fragment1.show(getFragmentManager(), "dialogNewLista");
    }

    protected void PRC_Salir() {
        this.finish();
        //DialogFragment dialog = new c_dialog_Salir();
        //dialog.show(getFragmentManager(), "dialogSalir");
    }

    protected void PRC_About() {
        // Lanzamos la actividad about
        Intent activityChangeIntent = new Intent(c_shopping_list.this, c_about.class);

        c_logging.getInstance().log(c_logging.LOG_INFO, "About");
        c_shopping_list.this.startActivity(activityChangeIntent);
    }

    protected void PRC_Settings() {
        // Lanzamos la actividad settings
        //Intent activityChangeIntent = new Intent(c_shopping_list.this, c_settings.class);

        //c_logging.getInstance().log(c_logging.LOG_INFO, "Settings");
        //c_shopping_list.this.startActivity(activityChangeIntent);
        Intent i = new Intent(this, c_settings.class);
        startActivityForResult(i, RESULT_SETTINGS);
    }

    @Override
    // Al volver de la actividad Settings
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        switch (requestCode) {
            case RESULT_SETTINGS:
                showUserSettings();
                break;
            case RESULT_LIST_PRODUCTS:
                c_logging.getInstance().log(c_logging.LOG_INFO, data.getStringExtra("RETURN_ACTIVITY"));

                // Refrescar la lista
                int TotalElementosLista = BD.fnc_get_All_T_LISTA().size();

                // Si el total de Elementos es > 0 ocultamos el icono del centro del layout
                if (TotalElementosLista > 0) {
                    ImageView icono_centro = (ImageView) findViewById(R.id.empty);
                    icono_centro.setVisibility(View.INVISIBLE);
                    // Tener en cuenta esto para incluirlo al borrar un elemento
                } else {
                    ImageView icono_centro = (ImageView) findViewById(R.id.empty);
                    icono_centro.setVisibility(View.VISIBLE);
                    // Tener en cuenta esto para incluirlo al borrar un elemento
                }

                // Listas
                c_logging.getInstance().log(c_logging.LOG_INFO, "Total Registros LISTA: " + TotalElementosLista);

                // Matriz Bidimensional
                // Matriz de n Elementos y 8 columnas, el total de características de cada lista de la compra
                String[][] MatrizBidimensional = new String[TotalElementosLista][8];
                MatrizBidimensional = BD.fnc_export_lista(TotalElementosLista);

                // Recargamos la lista
                c_logging.getInstance().log(c_logging.LOG_INFO, "Creando lista");
                setListAdapter(new c_shopping_list_adapter(this, TotalElementosLista, MatrizBidimensional));

                // Desactivar el teclado nada más entrar para que no aparezca
                getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

                break;
        }
    }

    private void showUserSettings() {
        SharedPreferences sharedPrefs = PreferenceManager
                .getDefaultSharedPreferences(this);

        StringBuilder builder = new StringBuilder();

        builder.append("\n Username: "
                + sharedPrefs.getString("prefUsername", "NULL"));
        builder.append("\n Pass: "
                + sharedPrefs.getString("prefUserPass", "NULL"));

        builder.append("\n Send report:"
                + sharedPrefs.getBoolean("prefSendReport", false));

        builder.append("\n Sync Frequency: "
                + sharedPrefs.getString("prefSyncFrequency", "NULL"));

        c_logging.getInstance().log(c_logging.LOG_INFO, "Settings: " + builder.toString() );

        // Desactivar el teclado nada más entrar para que no aparezca
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
      }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {

        if (keyCode == KeyEvent.KEYCODE_BACK) {
            c_logging.getInstance().log(c_logging.LOG_INFO, getString(R.string.st_la_Exit));

            // Salir
            this.PRC_Salir();

            // Si el listener devuelve true, significa que el evento esta
            // procesado, y nadie debe hacer nada mas
            return false;
        }
        // para las demas cosas, se reenvia el evento al listener habitual
        return super.onKeyDown(keyCode, event);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // populateMenu(menu);
        // return (super.onCreateOptionsMenu(menu));

        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.m_shopping_list, menu);
        return (super.onCreateOptionsMenu(menu));
    }

    protected void PRC_Status() {
        // Lanzamos la actividad about
        Intent activityChangeIntent = new Intent(c_shopping_list.this, c_status.class);

        c_logging.getInstance().log(c_logging.LOG_INFO, "Status");
        c_shopping_list.this.startActivity(activityChangeIntent);
    }

    protected void PRC_Delete_All () {

        AlertDialog.Builder adb = new AlertDialog.Builder(this);
        adb.setTitle(R.string.st_sl_Delete_All_Sure);
        adb.setIcon(android.R.drawable.ic_dialog_alert);

        adb.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                BD.fnc_delete_all_tables(context);
                PRC_Recargar_Lista();
                c_logging.getInstance().log(c_logging.LOG_INFO, "DELETE ALL OK");
            } });

        adb.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                c_logging.getInstance().log(c_logging.LOG_INFO, "DELETE ALL CANCEL");
            } });


        adb.show();

    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {
            case R.id.m_sl_menu_action_add:
                // Creamos el Fragment
                this.PRC_Anadir_Lista();

                return false;
            case R.id.m_sl_menu_action_exit:
                // Creamos el Fragment
                this.PRC_Salir();

                return false;
            case R.id.m_sl_menu_action_about:
                this.PRC_About();
                return false;

            case R.id.m_sl_menu_action_settings:
                this.PRC_Settings();
                return false;

            case R.id.m_sl_menu_action_status:
                this.PRC_Status();
                return false;

            case R.id.m_sl_menu_action_delete_all:
                this.PRC_Delete_All ();
                return false;

            /*
            case R.id.m_sl_menu_action_logout:

                // Al cerrar la sesión desactivamos la preferencia de AUTO_LOGIN
                // Restauramos el email por defecto en las preferencias
                context = getApplicationContext();
                c_preferences appPrefs = new c_preferences(context);
                appPrefs.setAutoLogin(false);

                // Cerramos con la tarea asíncrona
                LanzarShoppinListTask(context, getString(R.string.st_sl_Closing_Session), getString(R.string.STR_OPERATION_LOGOUT));
                return true;
            */
        }
        return (super.onOptionsItemSelected(item));
    }
}

/*



 [APP    ] JSON:
 | {
 | 	"ListaDeLaCompra": [
 | 		{
 | 			"ID": 1,
 | 			"DESCRIPTION": "Dieta",
 | 			"CREATED": "2013-11-13 03:20:26",
 | 			"UPDATED": "2013-11-13 03:20:26",
 | 			"SHARED": "0"
 | 		},
 | 		{
 | 			"ID": 2,
 | 			"DESCRIPTION": "Fiesta",
 | 			"CREATED": "2013-11-13 05:20:26",
 | 			"UPDATED": "2013-11-13 05:20:26",
 | 			"SHARED": "1"
 | 		}
 | 	],
 | 	"Total": 2
 | }



public class c_shopping_list extends ListActivity {

    //protected ShoppinListTask	_Task						= null;

    static InputStream is = null;
    String ResponseHTTP = "";

    Integer ResultTask = null;
    ListView lv;

    final private static int DIALOG_SHOPPING_LIST_ADD = 1;
    private String NEW_LIST_SHARED = "";
    private String NEW_LIST_NAME = "";

    Integer ItemSelected = -1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.l_shopping_list);

        // Inicializamos la tarea
        //this.ResultTask = null;

        // Creamos la lista de la compra en base al array
        // LanzarShoppinListTask(context, getString(R.string.st_sl_Cargando_Listas), getString(R.string.STR_OPERATION_LOAD_LISTAS));
    }


    public void CrearListaDeLaCompra(String pObjetoSJON) {

        // En la variable ObjetoSJON viene el JSON para tratarlo
        // Ya viene devuelto como string ResponseHTTP por el método en AppHttpPostGet.executeRequest --> convertStreamToString
        try {
            // Cargamos el objeto JSON
            // Es un objeto json porque empieza por {}, si empezase por [] sería un array JSON
            JSONObject JSONObject = new JSONObject(pObjetoSJON);

            // si no está vacío
            if (JSONObject != null) {
                // Array de Listas de la Compra
                JSONArray JSONArrayLista = JSONObject.getJSONArray("ListaDeLaCompra");

                // Obtenemos el total del array
                int TotalArray = JSONArrayLista.length();

                // Obtenemos el total de JSON
                int TotalJSON = JSONObject.getInt("Total");

                // Si los 2 coinciden
                if (TotalArray == TotalJSON) {

                    // Matriz Bidimensional JSON
                    // Matriz de n Elementos y 5 columnas, el total de características de cada lista de la compra
                    String[][] MatrizBidimensionalJSON = new String[TotalJSON][6];

                    // Recorremos el array de Lista de la Compra
                    for (int i = 0; i < JSONArrayLista.length(); i++) {

                        // Por cada elemento de la lista creamos su correspondiente OBJETO JSON
                        JSONObject JSONObjectElement = new JSONObject(JSONArrayLista.get(i).toString());

                        // Sacamos cada propiedad
                        String JSON_OBJECT_ID = JSONObjectElement.getString("ID");
                        String JSON_OBJECT_DESCRIPTION = JSONObjectElement.getString("DESCRIPTION");
                        String JSON_OBJECT_CREATED = JSONObjectElement.getString("CREATED");
                        String JSON_OBJECT_UPDATED = JSONObjectElement.getString("UPDATED");
                        String JSON_OBJECT_SHARED = JSONObjectElement.getString("SHARED");
                        String JSON_OBJECT_COUNT = JSONObjectElement.getString("COUNT");

                        // Extremos los datos del JSON
                        MatrizBidimensionalJSON[i][0] = JSON_OBJECT_ID;
                        MatrizBidimensionalJSON[i][1] = JSON_OBJECT_DESCRIPTION;
                        MatrizBidimensionalJSON[i][2] = JSON_OBJECT_CREATED;
                        MatrizBidimensionalJSON[i][3] = JSON_OBJECT_UPDATED;
                        MatrizBidimensionalJSON[i][4] = JSON_OBJECT_SHARED;
                        MatrizBidimensionalJSON[i][5] = JSON_OBJECT_COUNT;

                        // AppLog.getInstance().log(AppLog.LOG_INFO,"****i: " + JSONArrayLista.get(i).toString());
                        c_logging.getInstance().log(
                                c_logging.LOG_INFO,
                                "i: [ " + JSON_OBJECT_ID + " - " + JSON_OBJECT_DESCRIPTION + " - " + JSON_OBJECT_CREATED + " - " + JSON_OBJECT_UPDATED + " - " + JSON_OBJECT_SHARED
                                        + " ] "
                        );
                    }
                    setListAdapter(new c_shopping_list_adapter(this, TotalJSON, MatrizBidimensionalJSON));
                }
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    public void onListItemClick(ListView parent, View v, int position, long id) {
        ItemSelected = position;

        // Lanzamos la actividad de la lista de elementos de la compra
        Intent mainIntent = new Intent().setClass(c_shopping_list.this, c_shopping_list_prod.class);
        startActivity(mainIntent);

    }







    private void LanzarShoppinListTask(Context context, String str_modo, String modo) {
        // Lanzamos la tarea asÃ­ncrona

        // Lanzar la ejecuciÃ³n solo una vez
        if (_Task != null && _Task.getStatus() != AsyncTask.Status.FINISHED) {
            c_logging.getInstance().log(c_logging.LOG_INFO, "Cancelando InitTask (si existe antes)");
            _Task.cancel(true);
        }

        // ///////// TAREA ASINCRONA
        _Task = new ShoppinListTask(c_shopping_list.this, str_modo, modo);
        _Task.execute(this);

        try {
            this.ResultTask = _Task.get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }


    protected class ShoppinListTask extends AsyncTask<Context, Integer, Integer> {

        Context						context;
        String						str_mesg;
        String						modo;
        ProgressDialog				progress;

        private static final int	NETWORK_THINKING							= 0;

        private static final int	NETWORK_OK									= 1;
        private static final int	NETWORK_FAIL								= 2;
        private static final int	NETWORK_WIFI								= 3;
        private static final int	NETWORK_MOBILE								= 4;
        private static final int	NETWORK_UNKNOWN								= 5;

        private static final int	CONNECTING_TO_SERVER						= 6;
        private static final int	CONNECTING_TO_SERVER_OK						= 7;
        private static final int	CONNECTING_TO_SERVER_ERROR					= 8;
        private static final int	CONNECTING_TO_SERVER_FINISH					= 9;
        private static final int	HTTP_CONNECTING_ERROR						= 10;
        private static final int	CONNECTING_TO_SERVER_ERROR_SOCKETTIMEOUT	= 11;
        private static final int	CONNECTING_TO_SERVER_ERROR_PROTOCOL			= 12;

        public ShoppinListTask(Context context, String str_modo, String modo) {
            c_logging.getInstance().log(c_logging.LOG_INFO, "CONSTRUCTOR");
            this.context = context;
            this.str_mesg = str_modo;
            this.modo = modo;
        }

        // -- run intensive processes here
        // -- notice that the datatype of the first param in the class
        // definition matches the param passed to this method
        // -- and that the datatype of the last param in the class definition
        // matches the return type of this mehtod
        @Override
        protected Integer doInBackground(Context... params) {
            // -- on every iteration
            // -- runs a while loop that causes the thread to sleep for 50 milliseconds
            // -- publishes the progress - calls the onProgressUpdate handler defined below
            // -- and increments the counter variable i by one
            //
            // int i = 0; while (i <= 50) { try { Thread.sleep(50);
            // publishProgress(i); i++; } catch (Exception e) {
            // AppLog.getInstance().log( "[doInBackground]" + e.getMessage()); }
            // }
            //
            // Variable de retorno de la tarea asï¿½ncrona
            // 1 si hay error
            // 0 si ha ido todo bien
            Integer return_code = 1;

            publishProgress(NETWORK_THINKING);

            // Comprobamos si hay conexion
            if (c_app_status.getInstance(this.context).isOnline(context)) {
                publishProgress(NETWORK_OK);
                c_logging.getInstance().log(c_logging.LOG_INFO, c_app_status.getInstance(this.context).getTypeStatus());

                // Comprobamos si es por wifi o mobil
                if ((c_connection_checking.getInstance(this.context).CheckWIFI()) || (c_connection_checking.getInstance(this.context).CheckMOBILE())) {
                    if (c_connection_checking.getInstance(this.context).CheckWIFI()) {
                        publishProgress(NETWORK_WIFI);
                    } else if (c_connection_checking.getInstance(this.context).CheckMOBILE()) {
                        publishProgress(NETWORK_MOBILE);
                    }
                    // Si llega aquÃ­ todo va bien lanzamos la conexion http
                    // ****************************************************
                    try {
                        // Conexion http
                        // Probamos la conexion contra el servidor para ver si
                        // hay respuesta si nos devuelve 0 estï¿½ ok si nos
                        // devuelve otra cosa distinta de 0
                        // no hay conexiï¿½n con el servidor.

                        publishProgress(CONNECTING_TO_SERVER);

                        c_constantes Constantes = new c_constantes();
                        c_http_post_get client = new c_http_post_get(Constantes.getAPI_PROTOCOL_HTTP() + Constantes.getAPI_IP(Constantes.getModoIP()) + Constantes.getAPI_URL_BASE()
                                + Constantes.getAPI_FILE(), Constantes.getAPI_CODIFICACION(), Constantes.getID_APP());

                        //
                        // Creamos el array con los datos de la operacion,
                        // username y password
                        //

                        ArrayList<NameValuePair> OpeUserPassw = new ArrayList<NameValuePair>();
                        OpeUserPassw.add(new BasicNameValuePair(getString(R.string.STR_OPERATION), this.modo));
                        // Extraemos de las preferencias el usuario actual
                        // Restauramos el email por defecto en las preferencias
                        Context context = getApplicationContext();
                        c_preferences appPrefs = new c_preferences(context);
                        OpeUserPassw.add(new BasicNameValuePair(getString(R.string.STR_USERNAME), appPrefs.getUsername(false)));
                        OpeUserPassw.add(new BasicNameValuePair(getString(R.string.STR_PASSWORD), appPrefs.getPassword(false)));

                        // Si la operación es la de new_list se pasa este parámetro sino NO
                        if (this.modo == getString(R.string.STR_OPERATION_LIST_ADD)) {
                            OpeUserPassw.add(new BasicNameValuePair(getString(R.string.STR_NEW_LIST_SHARED), NEW_LIST_SHARED));
                            OpeUserPassw.add(new BasicNameValuePair(getString(R.string.STR_NEW_LIST_NAME), NEW_LIST_NAME));
                        }

                        try {
                            // Le pasamos el array con las operaciones y los
                            // datos del usuario
                            // La variable HTTP_USER_AGENT_APP_ANDROID es para
                            // que el php que detecta el movil lo ponga como
                            // APP_MOVIL
                            client.Execute(c_http_post_get.RequestMethod.POST, getString(R.string.HTTP_USER_AGENT_APP_ANDROID), OpeUserPassw, this.context, this.modo);
                            publishProgress(CONNECTING_TO_SERVER_OK);
                        } catch (SocketTimeoutException e) {
                            publishProgress(CONNECTING_TO_SERVER_ERROR_SOCKETTIMEOUT);
                            c_logging.getInstance().log(c_logging.LOG_ERROR, e.toString());
                        } catch (ClientProtocolException e) {
                            publishProgress(CONNECTING_TO_SERVER_ERROR_PROTOCOL);
                            c_logging.getInstance().log(c_logging.LOG_ERROR, e.toString());
                        } catch (Exception e) {
                            c_logging.getInstance().log(c_logging.LOG_ERROR, e.toString());
                            publishProgress(CONNECTING_TO_SERVER_ERROR);
                        }

                        // Guardamos la respuesta de la peticiï¿½n HTTP.
                        ResponseHTTP = client.getResponse();
                        ResponseHTTP = ResponseHTTP.replaceAll("[\n\r]", "");
                        ResponseHTTP = ResponseHTTP.trim();
                        int responseCode = client.getResponseCode();
                        c_logging.getInstance().log(c_logging.LOG_INFO, "ResponseHTTP:  " + ResponseHTTP);
                        c_logging.getInstance().log(c_logging.LOG_INFO, "ResponseCODE:  " + responseCode);
                        // 200
                        if (responseCode == HttpStatus.SC_OK) {
                            publishProgress(CONNECTING_TO_SERVER_FINISH);
                            // Esta variable es la que devuelve el procedimiento
                            // cuando todo acaba bien.
                            // Es la que procesará el procedimiento PostExecuted
                            // con el nombre "resul"
                            // En este caso "resul" devolverá en postexecuted un
                            // 0
                            return_code = 0;
                        } else {
                            // Hago esto para que si hay algï¿½n error me lo
                            // devuelve en un Toast
                            publishProgress(responseCode);
                        }

                        // Fin conexion http
                    } catch (Exception e) {
                        c_logging.getInstance().log(c_logging.LOG_ERROR, e.toString());
                        publishProgress(HTTP_CONNECTING_ERROR);
                    }
                    // ****************************************************
                } else {
                    // ni wifi ni mobile
                    publishProgress(NETWORK_UNKNOWN);
                }
            } else {
                // sin conexion
                publishProgress(NETWORK_FAIL);
            }
            // Variable de retorno de la tarea asï¿½ncrona
            // 1 -> si devuelve 1 es que no se ha realizado correctamente la
            // conexiï¿½n. Despuï¿½s tenemos que procesar el resultado json.
            return return_code;
        }

        // -- gets called just before thread begins
        @Override
        protected void onPreExecute() {
            c_logging.getInstance().log(c_logging.LOG_INFO, "INICIALIZANDO");
            super.onPreExecute();

            progress = new ProgressDialog(context);
            progress.setMessage(str_mesg);
            // set other progressbar attributes
            progress.show();
        }

        // -- called from the publish progress
        // -- notice that the datatype of the second param gets passed to this
        // method
        @Override
        protected void onProgressUpdate(Integer... code) {
            super.onProgressUpdate(code);

            String mensaje = "";
            switch (code[0]) {
                case NETWORK_OK:
                    mensaje = getString(R.string.st_la_Network_Ok);
                    break;
                case NETWORK_FAIL:
                    mensaje = getString(R.string.st_la_Network_Fail);
                    Toast.makeText(getApplicationContext(), mensaje, Toast.LENGTH_LONG).show();
                    break;
                case NETWORK_WIFI:
                    mensaje = getString(R.string.st_la_Network_Ok) + " " + getString(R.string.st_la_WIFI);
                    break;
                case NETWORK_MOBILE:
                    mensaje = getString(R.string.st_la_Network_Ok) + " " + getString(R.string.st_la_MOBILE);
                    break;
                case NETWORK_UNKNOWN:
                    mensaje = getString(R.string.st_la_Network_Ok) + " " + getString(R.string.st_la_UNKNOWN);
                    Toast.makeText(getApplicationContext(), mensaje, Toast.LENGTH_LONG).show();
                    break;
                case CONNECTING_TO_SERVER:
                    mensaje = getString(R.string.st_la_Connecting);
                    break;
                case CONNECTING_TO_SERVER_OK:
                    mensaje = getString(R.string.st_la_Connecting) + " " + getString(R.string.st_la_OK);
                    break;
                case CONNECTING_TO_SERVER_ERROR:
                    mensaje = getString(R.string.st_la_Connecting) + " " + getString(R.string.st_la_Refused);
                    Toast.makeText(getApplicationContext(), mensaje, Toast.LENGTH_LONG).show();
                    break;
                case CONNECTING_TO_SERVER_FINISH:
                    // mensaje = getString(R.string.Connect_to_server) + " " +
                    // getString(R.string.Connect_to_server_ok);
                    // Toast.makeText(getApplicationContext(),
                    // getString(R.string.Http_Connect_Finish),
                    // Toast.LENGTH_LONG).show();
                    break;
                case HTTP_CONNECTING_ERROR:
                    mensaje = getString(R.string.st_la_Http_Connect_Error);
                    Toast.makeText(getApplicationContext(), mensaje, Toast.LENGTH_LONG).show();
                    break;
                case CONNECTING_TO_SERVER_ERROR_SOCKETTIMEOUT:
                    mensaje = getString(R.string.st_la_Connect_Server_Error_Sockettimeout);
                    Toast.makeText(getApplicationContext(), mensaje, Toast.LENGTH_LONG).show();
                    break;
                case CONNECTING_TO_SERVER_ERROR_PROTOCOL:
                    mensaje = getString(R.string.st_la_Connect_Server_Error_Protocol);
                    Toast.makeText(getApplicationContext(), mensaje, Toast.LENGTH_LONG).show();
                    break;
                case NETWORK_THINKING:
                    mensaje = getString(R.string.st_la_Check_Connection_Thinking);
                    break;
                default:
                    // Aquï¿½ se va cuando hay mensajes 200, 300, 400, ... 500 ....
                    mensaje = getString(R.string.st_la_Connecting) + " - ErrorCode:" + code[0].toString();
                    Toast.makeText(getApplicationContext(), mensaje, Toast.LENGTH_LONG).show();
                    break;
            }
            c_logging.getInstance().log(c_logging.LOG_INFO, "PROGRESS: (" + code[0].toString() + ")" + mensaje);
            progress.setMessage(mensaje);
            // Hacemos una pausa pequeï¿½a
            // SystemClock.sleep(100);

        }

        // -- called if the cancel button is pressed
        @Override
        protected void onCancelled() {
            super.onCancelled();
            c_logging.getInstance().log(c_logging.LOG_INFO, "CANCELLED");
        }

        // -- called as soon as doInBackground method completes
        // -- notice that the third param gets passed to this method
        @Override
        protected void onPostExecute(Integer result) {

            // El valor de esta variable viene del procedimiento
            // doBackgroundtStreamToString(instream); (return_code)
            // result = 1 error
            // result = 0 ok
            c_logging.getInstance().log(c_logging.LOG_INFO, "1Result:  " + result + " ResponseHTTP: " + ResponseHTTP);

            // La conexion se ha realiado con éxito ahora hay que ver si el
            // login se ha hecho bien.
            if (result == 0) {
                // Comprobamos el json
                // En ResponseHTTP tenemos el JSON recibido de la app PHP
                if ((ResponseHTTP == "") || (ResponseHTTP == null)) {
                    Toast.makeText(getApplicationContext(), getString(R.string.st_la_Error) + ':' + this.modo, Toast.LENGTH_LONG).show();
                    c_logging.getInstance().log(c_logging.LOG_INFO, getString(R.string.st_la_Error) + ':' + this.modo + ' ' + "2Result:  " + result + " ResponseHTTP: " + ResponseHTTP);
                } else {
                    if (this.modo == getString(R.string.STR_OPERATION_LOGOUT)) {
                        // Cerrar sesion
                        c_logging.getInstance().log(c_logging.LOG_INFO, getString(R.string.st_sl_Closing_Session));
                        Intent mainIntent = new Intent().setClass(c_shopping_list.this, c_login_activity.class);
                        startActivity(mainIntent);
                        finish();
                    } else if (this.modo == getString(R.string.STR_OPERATION_LOAD_LISTAS)) {
                        // Todo correcto se pasa el objeto JSON al proc que creará la lista.

                        // Cargamos la lista de la Compra pasándole el JSON
                        CrearListaDeLaCompra(ResponseHTTP);
                        c_logging.getInstance().log(c_logging.LOG_INFO, getString(R.string.st_sl_Cargando_Listas));

                    } else if (this.modo == getString(R.string.STR_OPERATION_LIST_ADD)) {
                        // Creación correcta
                        if (ResponseHTTP.equals("0")) {
                            Toast.makeText(getApplicationContext(), "Creación correcta.", Toast.LENGTH_LONG).show();
                            LanzarShoppinListTask(context, getString(R.string.st_sl_Cargando_Listas), getString(R.string.STR_OPERATION_LOAD_LISTAS));
                            // Lista duplicada
                        } else if ((ResponseHTTP.equals("1")) || (ResponseHTTP.equals("2")) || (ResponseHTTP.equals("3"))) {
                            Toast.makeText(getApplicationContext(), "Lista duplicada", Toast.LENGTH_LONG).show();
                        }
                    }
                }

            } else if (result == 1) {
                // En este caso que la variable result ha devuelto 1, nos da
                // igual el valor que ha devuelto ResponseHTTP, ya que
                // ahí debería haber un array con la lista de la compra.
                Toast.makeText(getApplicationContext(), getString(R.string.st_la_Error) + ':' + this.modo + ' ', Toast.LENGTH_LONG).show();
                c_logging.getInstance().log(c_logging.LOG_ERROR, getString(R.string.st_la_Error) + ':' + this.modo + ' ' + " 7Result:  " + result + " ResponseHTTP: " + ResponseHTTP);
            } else {
                // En este caso que la variable result ha devuelto otra cosa,
                // nos da igual el valor que ha devuelto ResponseHTTP, ya que
                // ahí debería haber un array con la lista de la compra.
                Toast.makeText(getApplicationContext(), getString(R.string.st_la_Error) + ':' + this.modo + ' ' + result.toString(), Toast.LENGTH_LONG).show();
                c_logging.getInstance().log(c_logging.LOG_ERROR, getString(R.string.st_la_Error) + ':' + this.modo + ' ' + " 8Result:  " + result + " ResponseHTTP: " + ResponseHTTP);
            }

            progress.dismiss();
        }
    }

}




package com.imarkket;

        import android.app.ListActivity;
        import android.content.Context;
        import android.os.Bundle;
        import android.view.KeyEvent;
        import android.view.Menu;
        import android.view.MenuItem;
        import android.view.View;
        import android.widget.Button;
        import android.widget.TextView;

        import com.imarkket.Dialogs.DialogCustom;
        import com.imarkket.Library.c_logging;
        import com.imarkket.sqlite.handler.c_bd_handler;

public class c_shopping_list extends ListActivity implements DialogCustom.onSubmitListener {

    static Context                              context;

    TextView mTextView;
    Button mButton;

    @Override
    public void setOnSubmitListener(String arg) {
        mTextView.setText(arg);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.l_shopping_list);


        // Inicializamos la tarea
        //this.ResultTask = null;

        // Creamos la lista de la compra en base al array
        // LanzarShoppinListTask(context, getString(R.string.st_sl_Cargando_Listas), getString(R.string.STR_OPERATION_LOAD_LISTAS));

        // Cargar la lista
        context = getApplicationContext();

        // Base de Datos
        c_bd_handler BD = new c_bd_handler(context);

        // Inicializamos la BD
        BD.bd_handler_init(context);

        // Listas
        c_logging.getInstance().log(c_logging.LOG_INFO, "Total Registros LISTA: " + BD.getAll_T_LISTA().size() );

        // Creating ELEMENTOS
        //c_logging.getInstance().log(c_logging.LOG_INFO, "Total Registros ELEMENTO: " + BD.getAllELEMENTOS().size() );
        //t_producto elemento = new t_producto( BD.getAllELEMENTOS().size(), "Shopping" );
        //long elemento_id = BD.createT_ELEMENTO( elemento );
        //c_logging.getInstance().log(c_logging.LOG_INFO, "Total Registros ELEMENTO: " + BD.getAllELEMENTOS().size());

        // Creating LISTAS

        //t_lista lista = new t_lista(BD.getAllLISTAS().size(), "iPhone 5S", 0);
        //long lista_id = BD.createT_LISTA( lista, new long[] { elemento_id });
        //c_logging.getInstance().log(c_logging.LOG_INFO, "Total Registros LISTA: " + BD.getAllLISTAS().size());
/*

        // Inserting todos in db
        // Inserting todos under "Shopping" Tag

        long todo2_id = db.createToDo(todo2, new long[] { tag1_id });
        long todo3_id = db.createToDo(todo3, new long[] { tag1_id });

        // Inserting todos under "Watchlist" Tag
        long todo4_id = db.createToDo(todo4, new long[] { tag3_id });
        long todo5_id = db.createToDo(todo5, new long[] { tag3_id });
        long todo6_id = db.createToDo(todo6, new long[] { tag3_id });
        long todo7_id = db.createToDo(todo7, new long[] { tag3_id });

        // Inserting todos under "Important" Tag
        long todo8_id = db.createToDo(todo8, new long[] { tag2_id });
        long todo9_id = db.createToDo(todo9, new long[] { tag2_id });

        // Inserting todos under "Androidhive" Tag
        long todo10_id = db.createToDo(todo10, new long[] { tag4_id });
        long todo11_id = db.createToDo(todo11, new long[] { tag4_id });

        Log.e("Todo Count", "Todo count: " + db.getToDoCount());

        // "Post new Article" - assigning this under "Important" Tag
        // Now this will have - "Androidhive" and "Important" Tags
        db.createTodoTag(todo10_id, tag2_id);

        // Getting all tag names
        Log.d("Get Tags", "Getting All Tags");

        List<Tag> allTags = db.getAllTags();
        for (Tag tag : allTags) {
            Log.d("Tag Name", tag.getTagName());
        }

        // Getting all Todos
        Log.d("Get Todos", "Getting All ToDos");

        List<Todo> allToDos = db.getAllToDos();
        for (Todo todo : allToDos) {
            Log.d("ToDo", todo.getNote());
        }

        // Getting todos under "Watchlist" tag name
        Log.d("ToDo", "Get todos under single Tag name");

        List<Todo> tagsWatchList = db.getAllToDosByTag(tag3.getTagName());
        for (Todo todo : tagsWatchList) {
            Log.d("ToDo Watchlist", todo.getNote());
        }

        // Deleting a ToDo
        Log.d("Delete ToDo", "Deleting a Todo");
        Log.d("Tag Count", "Tag Count Before Deleting: " + db.getToDoCount());

        db.deleteToDo(todo8_id);

        Log.d("Tag Count", "Tag Count After Deleting: " + db.getToDoCount());

        // Deleting all Todos under "Shopping" tag
        Log.d("Tag Count",
                "Tag Count Before Deleting 'Shopping' Todos: "
                        + db.getToDoCount());

        db.deleteTag(tag1, true);

        Log.d("Tag Count",
                "Tag Count After Deleting 'Shopping' Todos: "
                        + db.getToDoCount());

        // Updating tag name
        tag3.setTagName("Movies to watch");
        db.updateTag(tag3);

        // Don't forget to close database connection
        db.closeDB();

    }


        // phone status
        //c_phone_status PhoneStatus = new c_phone_status(context);
        //mEmailView.setText(
        //        PhoneStatus.getDeviceid() + " / "+
        //PhoneStatus.getDeviceSoftwareVersion() + " / "+
        //PhoneStatus.getSimSerialNumber() + " / ");




    }



    */